package com.ktg.common.utils.poi.tool1;

import com.ktg.common.core.text.Convert;
import com.ktg.common.utils.DateUtils;
import com.ktg.common.utils.StringUtils;
import com.ktg.common.utils.poi.*;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

/**
 * Created by huangzheng on 2016/11/29.
 */
public class ExcelClass {

    private static final Logger log = LoggerFactory.getLogger(ExcelClass.class);


    /**
     * 导出类型（EXPORT:导出数据；IMPORT：导入模板）
     */
    private ExcelStyle.Type type;

    /**
     * 工作薄对象
     */
    private Workbook wb;

    /**
     * 工作表对象
     */
    private Sheet sheet;

    public ExcelClass()
    {

    }

//    public void init(List<Map> list, String sheetName, String title, ExcelStyle.Type type)
//    {
//        if (list == null)
//        {
//            list = new ArrayList<Map>();
//        }
//        this.list = list;
//        this.sheetName = sheetName;
//        this.type = type;
//        this.title = title;
//
//        this.maxHeight = getRowHeight();
//
//        createWorkbook();
//        createTitle();
//    }

//    public void initInterface(List<Map> list, String sheetName, String title, ExcelStyle.Type type)
//    {
//        if (list == null)
//        {
//            list = new ArrayList<Map>();
//        }
//        this.list = list;
//        this.sheetName = sheetName;
//        this.type = type;
//        this.title = title;
//
//        this.maxHeight = getRowHeight();
//
//        createWorkbook();
//        createTitle();
//    }


//    /**
//     * 创建excel第一行标题
//     */
//    public void createTitle()
//    {
//        if (StringUtils.isNotEmpty(title))
//        {
//            Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0);
//            titleRow.setHeightInPoints(30);
//            Cell titleCell = titleRow.createCell(0);
//            titleCell.setCellStyle(createStyle(this.wb,null,titleRow,0,"title"));
//            titleCell.setCellValue(title);
//            sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(),
//                    this.tempTitle.size() - 1));
//        }
//    }





    /**
     * 对excel表单指定表格索引名转换成list
     *
     * @param sheetName 表格索引名
     * @param is 输入流
     * @return 转换后集合
     */
    public List<Map> importExcel(InputStream is, List<ExcelToClass> modelList,int startSheet,int startRow,ExcelEnd end) throws Exception
    {
        this.type = ExcelStyle.Type.IMPORT;
        this.wb = WorkbookFactory.create(is);
        List<Map> list = new ArrayList<Map>();
        Integer count = this.wb.getNumberOfSheets();
        if (count > startSheet){
            for (int i = startSheet;i < count;i++){
                Sheet sheet = wb.getSheetAt(i);
                List<Map> list1 = importExcelSheet(sheet,modelList,startRow,end);
                list.addAll(list1);
            }
        }
        return list;
    }

    public List<Map> importExcelSheet(Sheet sheet, List<ExcelToClass> modelList,int startRow,ExcelEnd end) throws Exception{
        List<Map> mapList = new ArrayList<>();
        // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet
        if (sheet == null)
        {
            throw new IOException("文件sheet不存在");
        }
        // 获取最后一个非空行的行下标，比如总行数为n，则返回的为n-1
        int rows = sheet.getLastRowNum();

        if (rows >= startRow)
        {
            for (int i = startRow;i < rows;i++){
                Row row = sheet.getRow(i);

                Map map = sheetRow(row,modelList,end);
                String columns = end.getColumns();
                if (end.getType() == ExcelEndType.rowNull){
                    if (map == null || map.keySet().size() == 0){
                        return mapList;
                    }
                }else if (end.getType() == ExcelEndType.cellNull){
                    String[] split = columns.split(",");
                    for (int j = 0; j < split.length;j++){
                        Object obj = map.get(split[j]);
                        if (obj == null || (obj instanceof String && ((String)obj).length() == 0) ) {
                            return mapList;
                        }
                    }
                }else if (end.getType() == ExcelEndType.cellGroupAllNull){
                    String[] split = columns.split(",");
                    int isFls = 0;
                    for (int j = 0; j < split.length;j++){
                        Object obj = map.get(split[j]);
                        if (obj == null || (obj instanceof String && ((String)obj).length() == 0) ){
                            isFls++;
                        }
                    }
                    if (isFls == split.length ){
                        return mapList;
                    }
                }
                mapList.add(map);

            }
        }
        return mapList;
    }


    public Map sheetRow(Row row, List<ExcelToClass> modelList,ExcelEnd end) throws Exception{
        Map entity = new HashMap<>();
        for (int i = 0;i < modelList.size();i++)
        {
            ExcelToClass toClass = modelList.get(i);
            Object val = this.getCellValue(row,toClass.getColumnIndex());

            // 取得类型,并根据对象类型设置值.
            Class<?> fieldType = toClass.getDataType();

            if (String.class == fieldType)
            {
                String s = Convert.toStr(val);
                if (StringUtils.endsWith(s, ".0"))
                {
                    val = StringUtils.substringBefore(s, ".0");
                }
                else
                {
                    String dateFormat = toClass.getDateFormat();
                    if (StringUtils.isNotEmpty(dateFormat))
                    {
                        val = parseDateToStr(dateFormat, val);
                    }
                    else
                    {
                        val = Convert.toStr(val);
                    }
                }
            }else if (Date.class == fieldType){
                String dateFormat = toClass.getDateFormat();
                if (StringUtils.isNotEmpty(dateFormat))
                {
                    val = parseDateToStr(dateFormat, val);
                }
                else
                {
                    val = Convert.toStr(val);
                }
            }
            else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val)))
            {
                val = Convert.toInt(val);
            }
            else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val)))
            {
                val = Convert.toLong(val);
            }
            else if (Double.TYPE == fieldType || Double.class == fieldType)
            {
                val = Convert.toDouble(val);
            }
            else if (Float.TYPE == fieldType || Float.class == fieldType)
            {
                val = Convert.toFloat(val);
            }
            else if (BigDecimal.class == fieldType)
            {
                val = Convert.toBigDecimal(val);
            }
            else if (Date.class == fieldType)
            {
                if (val instanceof String)
                {
                    val = DateUtils.parseDate(val);
                }
                else if (val instanceof Double)
                {
                    val = DateUtil.getJavaDate((Double) val);
                }
            }
            else if (Boolean.TYPE == fieldType || Boolean.class == fieldType)
            {
                val = Convert.toBool(val, false);
            }

            entity.put(toClass.getToName(),val);
        }
        return entity;
    }


//    /**
//     * 对list数据源将其里面的数据导入到excel表单
//     *
//     * @param excelRowModel 数据集
//     * @param response 返回数据
//     *
//     * @return 结果
//     */
//    public void exportExcel(ExcelRowModel excelRowModel, HttpServletResponse response){
//        List<ExcelRowModel> list = new ArrayList<>();
//        list.add(excelRowModel);
//        exportExcel(list,response);
//    }


//    /**
//     * 对list数据源将其里面的数据导入到excel表单
//     *
//     * @param list 数据集
//     * @param response 返回数据
//     *
//     * @return 结果
//     */
//    public void exportExcel(List<ExcelRowModel> list,HttpServletResponse response)
//    {
//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//        response.setCharacterEncoding("utf-8");
//
//
//
//        this.wb = new SXSSFWorkbook(500);
//
//        try
//        {
//            this.type = ExcelStyle.Type.EXPORT;
//            this.title = StringUtils.EMPTY;
//            for (int i = 0;i < list.size();i++){
//                ExcelRowModel excelRowModel = list.get(i);
//                rownum = 0;
//                this.list = excelRowModel.getMapList();
//                this.tempTitle = excelRowModel.getTitleList();
//                this.maxHeight = getRowHeight();
//                this.sheet = wb.createSheet();
//                this.sheetName = excelRowModel.getSheetName();
//                wb.setSheetName(i, sheetName);
//                if (wb.getSheet(this.sheetName) == null){
//                    return;
//                }
//                createTitle();
//                writeSheet();
//            }
//
//            wb.write(response.getOutputStream());
//        }
//        catch (Exception e)
//        {
//            log.error("导出Excel异常{}", e.getMessage());
//        }
//        finally
//        {
//            IOUtils.closeQuietly(wb);
//        }
//    }


//    /**
//     * 对list数据源将其里面的数据导入到excel表单
//     *
//     * @param sheetName 工作表的名称
//     * @return 结果
//     */
//    public AjaxResult importTemplateExcel(String sheetName)
//    {
//        return importTemplateExcel(sheetName, StringUtils.EMPTY);
//    }

//    /**
//     * 对list数据源将其里面的数据导入到excel表单
//     *
//     * @param sheetName 工作表的名称
//     * @param title 标题
//     * @return 结果
//     */
//    public AjaxResult importTemplateExcel(String sheetName, String title)
//    {
//        this.init(null, sheetName, title, ExcelStyle.Type.IMPORT);
//        return exportExcel();
//    }

//    /**
//     * 对list数据源将其里面的数据导入到excel表单
//     *
//     * @param sheetName 工作表的名称
//     * @return 结果
//     */
//    public void importTemplateExcel(HttpServletResponse response, String sheetName)
//    {
//        importTemplateExcel(response, sheetName, StringUtils.EMPTY);
//    }

//    /**
//     * 对list数据源将其里面的数据导入到excel表单
//     *
//     * @param sheetName 工作表的名称
//     * @param title 标题
//     * @return 结果
//     */
//    public void importTemplateExcel(HttpServletResponse response, String sheetName, String title)
//    {
//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//        response.setCharacterEncoding("utf-8");
//        this.init(null, sheetName, title, ExcelStyle.Type.IMPORT);
//        exportExcel(response);
//    }

//    /**
//     * 对list数据源将其里面的数据导入到excel表单
//     *
//     * @return 结果
//     */
//    public void exportExcel(HttpServletResponse response)
//    {
//        try
//        {
//            writeSheet();
//            wb.write(response.getOutputStream());
//        }
//        catch (Exception e)
//        {
//            log.error("导出Excel异常{}", e.getMessage());
//        }
//        finally
//        {
//            IOUtils.closeQuietly(wb);
//        }
//    }

//    /**
//     * 对list数据源将其里面的数据导入到excel表单
//     *
//     * @return 结果
//     */
//    public AjaxResult exportExcel()
//    {
//        OutputStream out = null;
//        try
//        {
//            writeSheet();
//            String filename = encodingFilename(sheetName);
//            out = new FileOutputStream(getAbsoluteFile(filename));
//            wb.write(out);
//            return AjaxResult.success(filename);
//        }
//        catch (Exception e)
//        {
//            log.error("导出Excel异常{}", e.getMessage());
//            throw new UtilException("导出Excel失败，请联系网站管理员！");
//        }
//        finally
//        {
//            IOUtils.closeQuietly(wb);
//            IOUtils.closeQuietly(out);
//        }
//    }

//    /**
//     * 创建写入数据到Sheet
//     */
//    public void writeSheet()
//    {
//        // 取出一共有多少个sheet.
//        int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize));
//        for (int index = 0; index < sheetNo; index++)
//        {
//            createSheet(sheetNo, index);
//
//            // 产生一行
//            Row row = sheet.createRow(rownum);
//            int column = 0;
//            // 写入各个字段的列头名称
//            for (ExcelTitle excel : tempTitle)
//            {
//                this.createCell(excel, row, column++);
//            }
//            if (ExcelStyle.Type.EXPORT.equals(type))
//            {
//                fillExcelData(index, row);
//                addStatisticsRow();
//            }
//        }
//    }

//    /**
//     * 填充excel数据
//     *
//     * @param index 序号
//     * @param row 单元格行
//     */
//    public void fillExcelData(int index, Row row)
//    {
//        int startNo = index * sheetSize;
//        int endNo = Math.min(startNo + sheetSize, list.size());
//        for (int i = startNo; i < endNo; i++)
//        {
//            int rowIndex = i + 1 + rownum - startNo;
//            row = sheet.createRow(rowIndex);
//            // 得到导出对象.
//            Map vo = (Map) list.get(i);
//            int column = 0;
//            for (ExcelTitle excel : tempTitle)
//            {
//                this.addCell(excel, row, vo, column++);
//            }
//        }
//    }

//    /**
//     * 创建表格样式
//     *
//     * @param wb 工作薄对象
//     * @return 样式列表
//     */
//    private Map<String, CellStyle> createStyles(Workbook wb)
//    {
//        // 写入各条记录,每条记录对应excel表中的一行
//        Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
//        CellStyle style = wb.createCellStyle();
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//        Font titleFont = wb.createFont();
//        titleFont.setFontName("Arial");
//        titleFont.setFontHeightInPoints((short) 16);
//        titleFont.setBold(true);
//        style.setFont(titleFont);
//        styles.put("title", style);
//
//        style = wb.createCellStyle();
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//        style.setBorderRight(BorderStyle.THIN);
//        style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        style.setBorderLeft(BorderStyle.THIN);
//        style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        style.setBorderTop(BorderStyle.THIN);
//        style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        style.setBorderBottom(BorderStyle.THIN);
//        style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        Font dataFont = wb.createFont();
//        dataFont.setFontName("Arial");
//        dataFont.setFontHeightInPoints((short) 10);
//        style.setFont(dataFont);
//        styles.put("data", style);
//
//        style = wb.createCellStyle();
//        style.cloneStyleFrom(styles.get("data"));
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//        style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
//        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//        Font headerFont = wb.createFont();
//        headerFont.setFontName("Arial");
//        headerFont.setFontHeightInPoints((short) 10);
//        headerFont.setBold(true);
//        headerFont.setColor(IndexedColors.WHITE.getIndex());
//        style.setFont(headerFont);
//        styles.put("header", style);
//
//        style = wb.createCellStyle();
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//        Font totalFont = wb.createFont();
//        totalFont.setFontName("Arial");
//        totalFont.setFontHeightInPoints((short) 10);
//        style.setFont(totalFont);
//        styles.put("total", style);
//
//        style = wb.createCellStyle();
//        style.cloneStyleFrom(styles.get("data"));
//        style.setAlignment(HorizontalAlignment.LEFT);
//        styles.put("data1", style);
//
//        style = wb.createCellStyle();
//        style.cloneStyleFrom(styles.get("data"));
//        style.setAlignment(HorizontalAlignment.CENTER);
//        styles.put("data2", style);
//
//        style = wb.createCellStyle();
//        style.cloneStyleFrom(styles.get("data"));
//        style.setAlignment(HorizontalAlignment.RIGHT);
//        styles.put("data3", style);
//
//        return styles;
//    }


//    /**
//     * 创建表格样式
//     *
//     * @param wb 工作薄对象
//     * @return 样式列表
//     */
//    private CellStyle createStyle(Workbook wb,ExcelTitle attr,Row row,int column,String key)
//    {
//        // 写入各条记录,每条记录对应excel表中的一行
//        CellStyle style = wb.createCellStyle();
//        style.setAlignment(HorizontalAlignment.CENTER);
//        style.setVerticalAlignment(VerticalAlignment.CENTER);
//
//        Font font = wb.createFont();
//        font.setFontName("Arial");
//
//
//
//        if ("title".equals(key)){
//            font.setFontHeightInPoints((short) 16);
//            font.setBold(true);
//            style.setFont(font);
//        }
//
//        if ("data".equals(key)){
//            style.setBorderRight(BorderStyle.THIN);
//            style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//            style.setBorderLeft(BorderStyle.THIN);
//            style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//            style.setBorderTop(BorderStyle.THIN);
//            style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//            style.setBorderBottom(BorderStyle.THIN);
//            style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//
//            font.setFontHeightInPoints((short) 10);
//            style.setFont(font);
//        }
//
//        if ("header".equals(key)){
//            style.setBorderRight(BorderStyle.THIN);
//            style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//            style.setBorderLeft(BorderStyle.THIN);
//            style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//            style.setBorderTop(BorderStyle.THIN);
//            style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//            style.setBorderBottom(BorderStyle.THIN);
//            style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//
//            style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
//            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//
//            font.setFontHeightInPoints((short) 10);
//            font.setBold(true);
//            font.setColor(IndexedColors.WHITE.getIndex());
//            style.setFont(font);
//        }
//
//
//        if ("total".equals(key)) {
//            font.setFontHeightInPoints((short) 10);
//            style.setFont(font);
//        }
//
//
//        if ("data1".equals(key)) {
//            style.setAlignment(HorizontalAlignment.LEFT);
//        }
//
//        if ("data2".equals(key)) {
//            style.setAlignment(HorizontalAlignment.CENTER);
//        }
//
//        if ("data3".equals(key)) {
//            style.setAlignment(HorizontalAlignment.RIGHT);
//        }
//
//        if (attr != null){
//            //设置单元格颜色
//            if (attr.getFillForegroundColor() != null){
//                style.setFillForegroundColor(attr.getFillForegroundColor().getIndex());
//                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//            }
//
//            //判断 这行的颜色
//            int rowIndex = row.getRowNum();
//            if (attr.getRowBackgroundColor() != null){
//                IndexedColors colors =  attr.getRowBackgroundColor().get(rowIndex);
//                if (colors != null){
//                    style.setFillForegroundColor(colors.getIndex());
//                    style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//                }
//            }
//
//            if (attr.getRowTextColor() != null){
//                IndexedColors colors =  attr.getRowTextColor().get(rowIndex);
//                if (colors != null){
//                    font.setColor(colors.getIndex());
//                    font.setBold(true);
//                }
//            }
//        }
//
//
//        return style;
//    }


//    /**
//     * 创建单元格
//     */
//    public Cell createCell(ExcelTitle attr, Row row, int column)
//    {
//        // 创建列
//        Cell cell = row.createCell(column);
//        // 写入列信息
//        cell.setCellValue(attr.name());
//        setDataValidation(attr, row, column);
//        CellStyle cellStyle = createStyle(this.wb,attr,row,column,"header");
//
//        if (attr.getRowStyle() != null){
//            String key = row.getRowNum()+":"+column;
//            ExcelCell rowAttr = attr.getRowStyle().get(key);
//            if (rowAttr != null){
//                if (rowAttr.getFillForegroundColor() != null){
//                    cellStyle.setFillForegroundColor(rowAttr.getFillForegroundColor().getIndex());
//                }
//                if (rowAttr.getMergeColumn() > 0 || rowAttr.getMergeRow() > 0){
//                    CellRangeAddress rangeAddress = new CellRangeAddress(row.getRowNum(),row.getRowNum()+rowAttr.getMergeRow(),column,column+rowAttr.getMergeColumn());
//                    this.sheet.addMergedRegion(rangeAddress);
//                }
//                cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//            }
//        }
//        cell.setCellStyle(cellStyle);
//        return cell;
//    }

//    /**
//     * 设置单元格信息
//     *
//     * @param value 单元格值
//     * @param attr 注解相关
//     * @param cell 单元格信息
//     */
//    public void setCellVo(Object value, ExcelTitle attr, Cell cell)
//    {
//        if (ExcelStyle.ColumnType.STRING == attr.cellType())
//        {
//            String cellValue = Convert.toStr(value);
//            // 对于任何以表达式触发字符 =-+@开头的单元格，直接使用tab字符作为前缀，防止CSV注入。
//            if (StringUtils.startsWithAny(cellValue, FORMULA_STR))
//            {
//                cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0");
//            }
//            cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix());
//        }
//        else if (ExcelStyle.ColumnType.NUMERIC == attr.cellType())
//        {
//            if (StringUtils.isNotNull(value))
//            {
//                cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value));
//            }
//        }
//        else if (ExcelStyle.ColumnType.IMAGE == attr.cellType())
//        {
//            ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1);
//            String imagePath = Convert.toStr(value);
//            if (StringUtils.isNotEmpty(imagePath))
//            {
//                byte[] data = ImageUtils.getImage(imagePath);
//                getDrawingPatriarch(cell.getSheet()).createPicture(anchor,
//                        cell.getSheet().getWorkbook().addPicture(data, getImageType(data)));
//            }
//        }
//    }

//    /**
//     * 获取画布
//     */
//    public static Drawing<?> getDrawingPatriarch(Sheet sheet)
//    {
//        if (sheet.getDrawingPatriarch() == null)
//        {
//            sheet.createDrawingPatriarch();
//        }
//        return sheet.getDrawingPatriarch();
//    }

//    /**
//     * 获取图片类型,设置图片插入类型
//     */
//    public int getImageType(byte[] value)
//    {
//        String type = FileTypeUtils.getFileExtendName(value);
//        if ("JPG".equalsIgnoreCase(type))
//        {
//            return Workbook.PICTURE_TYPE_JPEG;
//        }
//        else if ("PNG".equalsIgnoreCase(type))
//        {
//            return Workbook.PICTURE_TYPE_PNG;
//        }
//        return Workbook.PICTURE_TYPE_JPEG;
//    }

//    /**
//     * 创建表格样式
//     */
//    public void setDataValidation(ExcelTitle attr, Row row, int column)
//    {
//        if (attr.name().indexOf("注：") >= 0)
//        {
//            sheet.setColumnWidth(column, 6000);
//        }
//        else
//        {
//            // 设置列宽
//            sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256));
//        }
//        if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0)
//        {
//            // 提示信息或只能选择不能输入的列内容.
//            setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column);
//        }
//    }

//    /**
//     * 添加单元格
//     */
//    public Cell addCell(ExcelTitle attr, Row row, Map vo, int column)
//    {
//        Cell cell = null;
//        try
//        {
//            // 设置行高
//            row.setHeight(maxHeight);
//            // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列.
//            if (attr.isExport())
//            {
//                // 创建cell
//                cell = row.createCell(column);
//                int align = attr.align().value();
//                CellStyle style = createStyle(this.wb,attr,row,column,"data" + (align >= 1 && align <= 3 ? align : ""));
//                if (attr.getRowStyle() != null){
//                    String skey = row.getRowNum()+":"+column;
//                    ExcelCell rowAttr = attr.getRowStyle().get(skey);
//                    if (rowAttr != null){
//                        if (rowAttr.getFillForegroundColor() != null){
//                            style.setFillForegroundColor(rowAttr.getFillForegroundColor().getIndex());
//                        }
//                        if (rowAttr.getMergeColumn() > 0 || rowAttr.getMergeRow() > 0){
//                            CellRangeAddress rangeAddress = new CellRangeAddress(row.getRowNum(),row.getRowNum()+rowAttr.getMergeRow(),column,column+rowAttr.getMergeColumn());
//                            this.sheet.addMergedRegion(rangeAddress);
//                        }
//                        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//                    }
//                }
//                cell.setCellStyle(style);
//
//
//                // 用于读取对象中的属性
//                Object value = vo.get(attr.getDataName());
//                String dateFormat = attr.dateFormat();
//                String readConverterExp = attr.readConverterExp();
//                String separator = attr.separator();
//                String dictType = attr.dictType();
//                if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
//                {
//                    cell.setCellValue(parseDateToStr(dateFormat, value));
//                }
//                else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
//                {
//                    cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator));
//                }
//                else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value))
//                {
//                    cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator));
//                }
//                else if (value instanceof BigDecimal && -1 != attr.scale())
//                {
//                    cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString());
//                }
//                else if (!attr.handler().equals(ExcelHandlerAdapter.class))
//                {
//                    cell.setCellValue(dataFormatHandlerAdapter(value, attr));
//                }
//                else
//                {
//                    // 设置列类型
//                    setCellVo(value, attr, cell);
//                }
//                addStatisticsData(column, Convert.toStr(value), attr);
//            }
//        }
//        catch (Exception e)
//        {
//            log.error("导出Excel失败{}", e);
//        }
//        return cell;
//    }

//    /**
//     * 设置 POI XSSFSheet 单元格提示或选择框
//     *
//     * @param sheet 表单
//     * @param textlist 下拉框显示的内容
//     * @param promptContent 提示内容
//     * @param firstRow 开始行
//     * @param endRow 结束行
//     * @param firstCol 开始列
//     * @param endCol 结束列
//     */
//    public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow,
//                                      int firstCol, int endCol)
//    {
//        DataValidationHelper helper = sheet.getDataValidationHelper();
//        DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1");
//        CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
//        DataValidation dataValidation = helper.createValidation(constraint, regions);
//        if (StringUtils.isNotEmpty(promptContent))
//        {
//            // 如果设置了提示信息则鼠标放上去提示
//            dataValidation.createPromptBox("", promptContent);
//            dataValidation.setShowPromptBox(true);
//        }
//        // 处理Excel兼容性问题
//        if (dataValidation instanceof XSSFDataValidation)
//        {
//            dataValidation.setSuppressDropDownArrow(true);
//            dataValidation.setShowErrorBox(true);
//        }
//        else
//        {
//            dataValidation.setSuppressDropDownArrow(false);
//        }
//        sheet.addValidationData(dataValidation);
//    }

//    /**
//     * 解析导出值 0=男,1=女,2=未知
//     *
//     * @param propertyValue 参数值
//     * @param converterExp 翻译注解
//     * @param separator 分隔符
//     * @return 解析后值
//     */
//    public static String convertByExp(String propertyValue, String converterExp, String separator)
//    {
//        StringBuilder propertyString = new StringBuilder();
//        String[] convertSource = converterExp.split(",");
//        for (String item : convertSource)
//        {
//            String[] itemArray = item.split("=");
//            if (StringUtils.containsAny(separator, propertyValue))
//            {
//                for (String value : propertyValue.split(separator))
//                {
//                    if (itemArray[0].equals(value))
//                    {
//                        propertyString.append(itemArray[1] + separator);
//                        break;
//                    }
//                }
//            }
//            else
//            {
//                if (itemArray[0].equals(propertyValue))
//                {
//                    return itemArray[1];
//                }
//            }
//        }
//        return StringUtils.stripEnd(propertyString.toString(), separator);
//    }

//    /**
//     * 反向解析值 男=0,女=1,未知=2
//     *
//     * @param propertyValue 参数值
//     * @param converterExp 翻译注解
//     * @param separator 分隔符
//     * @return 解析后值
//     */
//    public static String reverseByExp(String propertyValue, String converterExp, String separator)
//    {
//        StringBuilder propertyString = new StringBuilder();
//        String[] convertSource = converterExp.split(",");
//        for (String item : convertSource)
//        {
//            String[] itemArray = item.split("=");
//            if (StringUtils.containsAny(separator, propertyValue))
//            {
//                for (String value : propertyValue.split(separator))
//                {
//                    if (itemArray[1].equals(value))
//                    {
//                        propertyString.append(itemArray[0] + separator);
//                        break;
//                    }
//                }
//            }
//            else
//            {
//                if (itemArray[1].equals(propertyValue))
//                {
//                    return itemArray[0];
//                }
//            }
//        }
//        return StringUtils.stripEnd(propertyString.toString(), separator);
//    }

//    /**
//     * 解析字典值
//     *
//     * @param dictValue 字典值
//     * @param dictType 字典类型
//     * @param separator 分隔符
//     * @return 字典标签
//     */
//    public static String convertDictByExp(String dictValue, String dictType, String separator)
//    {
//        return DictUtils.getDictLabel(dictType, dictValue, separator);
//    }
//
//    /**
//     * 反向解析值字典值
//     *
//     * @param dictLabel 字典标签
//     * @param dictType 字典类型
//     * @param separator 分隔符
//     * @return 字典值
//     */
//    public static String reverseDictByExp(String dictLabel, String dictType, String separator)
//    {
//        return DictUtils.getDictValue(dictType, dictLabel, separator);
//    }
//
//    /**
//     * 数据处理器
//     *
//     * @param value 数据值
//     * @param excel 数据注解
//     * @return
//     */
//    public String dataFormatHandlerAdapter(Object value, ExcelTitle excel)
//    {
//        try
//        {
//            Object instance = excel.handler().newInstance();
//            Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class });
//            value = formatMethod.invoke(instance, value, excel.args());
//        }
//        catch (Exception e)
//        {
//            log.error("不能格式化数据 " + excel.handler(), e.getMessage());
//        }
//        return Convert.toStr(value);
//    }
//
//    /**
//     * 合计统计信息
//     */
//    private void addStatisticsData(Integer index, String text, ExcelTitle entity)
//    {
//        if (entity != null && entity.isStatistics())
//        {
//            Double temp = 0D;
//            if (!statistics.containsKey(index))
//            {
//                statistics.put(index, temp);
//            }
//            try
//            {
//                temp = Double.valueOf(text);
//            }
//            catch (NumberFormatException e)
//            {
//            }
//            statistics.put(index, statistics.get(index) + temp);
//        }
//    }
//
//    /**
//     * 创建统计行
//     */
//    public void addStatisticsRow()
//    {
//        if (statistics.size() > 0)
//        {
//            Row row = sheet.createRow(sheet.getLastRowNum() + 1);
//            Set<Integer> keys = statistics.keySet();
//            Cell cell = row.createCell(0);
//            cell.setCellStyle(createStyle(this.wb,null,row,0,"total"));
//            cell.setCellValue("合计");
//
//            for (Integer key : keys)
//            {
//                cell = row.createCell(key);
//                cell.setCellStyle(createStyle(this.wb,null,row,0,"total"));
//                cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key)));
//            }
//            statistics.clear();
//        }
//    }
//
//    /**
//     * 编码文件名
//     */
//    public String encodingFilename(String filename)
//    {
//        filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx";
//        return filename;
//    }
//
//    /**
//     * 获取下载路径
//     *
//     * @param filename 文件名称
//     */
//    public String getAbsoluteFile(String filename)
//    {
//        String downloadPath = RuoYiConfig.getDownloadPath() + filename;
//        File desc = new File(downloadPath);
//        if (!desc.getParentFile().exists())
//        {
//            desc.getParentFile().mkdirs();
//        }
//        return downloadPath;
//    }



//    /**
//     * 得到所有定义字段
//     */
//    private void createExcelField()
//    {
//        this.fields = getFields();
//        this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((ExcelTitle) objects[1]).sort())).collect(Collectors.toList());
//        this.maxHeight = getRowHeight();
//    }


//    /**
//     * 获取字段注解信息
//     */
//    public List<Object[]> getFields()
//    {
//        List<Object[]> fields = new ArrayList<Object[]>();
//        List<FieldInterface> tempFields = this.tempFields;
//        for (FieldInterface field : tempFields)
//        {
//            // 单注解
//            ExcelTitle attr = field.getAnnotation(ExcelTitle.class);
//            if (field != null && (attr.type() == Type.ALL || attr.type() == type))
//            {
//                field.setAccessible(true);
//                fields.add(new Object[] { field, attr });
//
//                attr.name();
//            }
//        }
//        return fields;
//    }

//    /**
//     * 根据注解获取最大行高
//     */
//    public short getRowHeight()
//    {
//        double maxHeight = 0;
//        for (ExcelTitle excel : this.tempTitle)
//        {
//            maxHeight = Math.max(maxHeight, excel.height());
//        }
//        return (short) (maxHeight * 20);
//    }
//
//    /**
//     * 创建一个工作簿
//     */
//    public void createWorkbook()
//    {
//        this.wb = new SXSSFWorkbook(500);
//        this.sheet = wb.createSheet();
//        wb.setSheetName(0, sheetName);
//    }
//
//    /**
//     * 创建工作表
//     *
//     * @param sheetNo sheet数量
//     * @param index 序号
//     */
//    public void createSheet(int sheetNo, int index)
//    {
//        // 设置工作表的名称.
//        if (sheetNo > 1 && index > 0)
//        {
//            this.sheet = wb.createSheet();
//            this.createTitle();
//            wb.setSheetName(index, sheetName + index);
//        }
//    }

    /**
     * 获取单元格值
     *
     * @param row 获取的行
     * @param column 获取单元格列号
     * @return 单元格值
     */
    public Object getCellValue(Row row, int column)
    {
        if (row == null)
        {
            return row;
        }
        Object val = "";
        try
        {
            Cell cell = row.getCell(column);

            if (StringUtils.isNotNull(cell))
            {
                if (cell.getCellType() == CellType.NUMERIC)
                {
                    // POI ExcelInterface 日期格式转换
                    val = cell.getNumericCellValue();
                    val = DateUtil.getJavaDate((Double) val);
                }
                else if (cell.getCellType() == CellType.FORMULA) {
                    val = cell.getNumericCellValue();
                    if ((Double) val % 1 != 0)
                    {
                        val = new BigDecimal(val.toString());
                    }
                    else
                    {
                        val = new DecimalFormat("0").format(val);
                    }
                }
                else if (cell.getCellType() == CellType.STRING)
                {
                    val = cell.getStringCellValue();
                }
                else if (cell.getCellType() == CellType.BOOLEAN)
                {
                    val = cell.getBooleanCellValue();
                }
                else if (cell.getCellType() == CellType.ERROR)
                {
                    val = cell.getErrorCellValue();
                }

            }
        }
        catch (Exception e)
        {
            return val;
        }
        return val;
    }

    /**
     * 判断是否是空行
     *
     * @param row 判断的行
     * @return
     */
    private boolean isRowEmpty(Row row)
    {
        if (row == null)
        {
            return true;
        }
        for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++)
        {
            Cell cell = row.getCell(i);
            if (cell != null && cell.getCellType() != CellType.BLANK)
            {
                return false;
            }
        }
        return true;
    }

//    /**
//     * 获取Excel2003图片
//     *
//     * @param sheet 当前sheet对象
//     * @param workbook 工作簿对象
//     * @return Map key:图片单元格索引（1_1）String，value:图片流PictureData
//     */
//    public static Map<String, PictureData> getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook)
//    {
//        Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
//        List<HSSFPictureData> pictures = workbook.getAllPictures();
//        if (!pictures.isEmpty())
//        {
//            for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren())
//            {
//                HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
//                if (shape instanceof HSSFPicture)
//                {
//                    HSSFPicture pic = (HSSFPicture) shape;
//                    int pictureIndex = pic.getPictureIndex() - 1;
//                    HSSFPictureData picData = pictures.get(pictureIndex);
//                    String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1());
//                    sheetIndexPicMap.put(picIndex, picData);
//                }
//            }
//            return sheetIndexPicMap;
//        }
//        else
//        {
//            return sheetIndexPicMap;
//        }
//    }
//
//    /**
//     * 获取Excel2007图片
//     *
//     * @param sheet 当前sheet对象
//     * @param workbook 工作簿对象
//     * @return Map key:图片单元格索引（1_1）String，value:图片流PictureData
//     */
//    public static Map<String, PictureData> getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook)
//    {
//        Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
//        for (POIXMLDocumentPart dr : sheet.getRelations())
//        {
//            if (dr instanceof XSSFDrawing)
//            {
//                XSSFDrawing drawing = (XSSFDrawing) dr;
//                List<XSSFShape> shapes = drawing.getShapes();
//                for (XSSFShape shape : shapes)
//                {
//                    if (shape instanceof XSSFPicture)
//                    {
//                        XSSFPicture pic = (XSSFPicture) shape;
//                        XSSFClientAnchor anchor = pic.getPreferredSize();
//                        CTMarker ctMarker = anchor.getFrom();
//                        String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol();
//                        sheetIndexPicMap.put(picIndex, pic.getPictureData());
//                    }
//                }
//            }
//        }
//        return sheetIndexPicMap;
//    }

    /**
     * 格式化不同类型的日期对象
     *
     * @param dateFormat 日期格式
     * @param val 被格式化的日期对象
     * @return 格式化后的日期字符
     */
    public String parseDateToStr(String dateFormat, Object val)
    {
        if (val == null)
        {
            return "";
        }
        String str;
        if (val instanceof Date)
        {
            str = DateUtils.parseDateToStr(dateFormat, (Date) val);
        }
        else if (val instanceof LocalDateTime)
        {
            str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val));
        }
        else if (val instanceof LocalDate)
        {
            str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val));
        }
        else
        {
            str = val.toString();
        }
        return str;
    }

}
